package cn.blb.service.oss.service.impl;

import cn.blb.common.result.ResultCode;
import cn.blb.service.base.handler.BLBException;
import cn.blb.service.oss.service.FileService;
import cn.blb.service.oss.util.PropUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {

    private final PropUtil propUtil;

    public FileServiceImpl(PropUtil propUtil) {
        this.propUtil = propUtil;
    }

    @Override
    public String upload(MultipartFile file,String path) {
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        String endpoint = propUtil.getEndpoint();
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = propUtil.getKeyid();
        String accessKeySecret = propUtil.getKeysecret();
        // 填写Bucket名称，例如examplebucket。
        String bucketName = propUtil.getBucketname();
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        // 通常情况下，objectName 目录：文件用途/年/月/日/uuid.后缀
        // 1.获取年月日
        // 2.获取uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        // 3.获取文件后缀
        String filename = file.getOriginalFilename();
        assert filename != null;
        String suffix = filename.substring(filename.lastIndexOf("."));
        // 4.path/年/月/日/uuid.文件后缀
        //String objectName = "exampledir/exampleobject.txt";
        String objectName =path+"/"+uuid+suffix;
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
        //String filePath= "D:\\localpath\\examplefile.txt";
        InputStream inputStream = null;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            inputStream = file.getInputStream();
            // 创建PutObjectRequest对象。
            //PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 如果需要上传时设置存储类型和访问权限，请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传文件。
            ossClient.putObject(putObjectRequest);
        } catch (OSSException | IOException oe) {
            throw new BLBException(ResultCode.FILE_UPLOAD_ERROR);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return "https://"+bucketName+"."+endpoint+"/"+objectName;
    }
}
